package MAIN;
//笔试强训第9天

//选择题
/*字符串类中大多数对字符串的操作都会产生一个新的对象*/
/*覆盖：子类继承父类，然后把父类的方法重写了*/
/*对象所占的堆内存是由自动内存管理系统回收，堆内存由存活和死亡对象，
空闲碎片组成，死亡对象会在一定时间内内存回收系统进行回收*/
/*Java中对于数组的复制，for循环是非常低效的，每次都要从开始位置遍历到指定位置的下标
* 每次循环还要判断一次是否达到数组的最大长度。  而Sysytem.arraycopy是浅拷贝，对于非基本数据类型，
* 它拷贝的是对象的引用，而不是创建一个对象。  Arrays.copyOf它的源码是先创建一个数组对象，然后调用
* System.arraycopy，此时的效率就很低了。   clone是特殊的方法，它对于对象是深拷贝，对于数组是浅拷贝
*  但是效率是高于ArrayscopOf的，  所以：System.arraycopy > Clone > Array.copyOf > for*/
/*一个基本数据类型和一个包装类型在用==进行比较的时候，此时==会对包装类型进行一个自动拆箱，==比较的是
* 里面的值，equal方法比较的也是值*/

import java.util.Locale;
import java.util.Scanner;

//编程题
public class Main9 {
    //走方格的方案数：沿格子边缘走，只能往右走或者是往下走
    //思路：递归求解，当n=1 m>1或者m = 1, n>1时，此时方案数就是n+m
    /*当m>1&& n > 1 时，此时有两种方式，往右走和往下走，往右走就是列减少一列
    * 往下走就是行减少遗一行，
    * 总结：当n>1&&m>1时，应该计算的是（n-1,m）+(n,m-1)的方案数，递归的条件就是
    * 起始条件：n=1 m>1或者m = 1, n>1，这也是终止条件*/
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNextInt()) {
            int n = scan.nextInt();//横向的格子数
            int m = scan.nextInt();//纵向的格子数
            System.out.println(med(n,m));
        }
    }
    public static int med(int n,int m) {
        if (n == 1 && m >= 1 || n >= 1 && m ==1) {
            return n + m;
        }
        return med(n-1,m) + med(n,m-1);
    }

    //另类加法:不能使用加号作为运算符或者使用其他的运算符来算加法
    //如果两个数相加（二进制）不需要进位，此时直接亦或即可。
    //如果两个数相加需要进位（二进制位），此时让B=（A&B）>>1
    //最后B为0的时候，就是相加后的结果
    /*总结：如果需要进位，就B=&两个数然后左移一位，如果不需要进位，亦或即可*/
    /*题解： 思路试想二进制0101和1101的相加过程01011101其实可以看成是不带进位的结果1000和进位产生的1010相加。
    而“不带进位的加法”其实就是异或运算，“进位”其实就是只有两个1的时候才会出现，也就是与运算*/
    public static int addAB(int A, int B) {
        // write code here
        if (B == 0) {
            return A;
        }
        int sum = 0;
        int carry = 0;
        while (B != 0) {
            sum = A ^ B;
            carry = (A & B) << 1;
            A = sum;
            B = carry;
        }
        return sum;
    }
}
